// excerpts from http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)

#ifndef MUDUO_NET_ACCEPTOR_H
#define MUDUO_NET_ACCEPTOR_H

#include <boost/function.hpp>
#include <boost/noncopyable.hpp>

#include "Channel.h"
#include "Socket.h"

namespace learnmuduo
{

class EventLoop;
class InetAddress;

///
/// Acceptor of incoming TCP connections.
///
class Acceptor : boost::noncopyable // 专门负责“接入”新 TCP 连接的组件; 监听套接字对应的 Channel 会在有新连接时触发回调
{
 public:
  typedef boost::function<void (int sockfd,
                                const InetAddress&)> NewConnectionCallback;

  Acceptor(EventLoop* loop, const InetAddress& listenAddr); // 在指定 EventLoop 上，用 listenAddr 构造监听 socket

  void setNewConnectionCallback(const NewConnectionCallback& cb) // 注册上层提供的新连接回调
  { newConnectionCallback_ = cb; }

  bool listenning() const { return listenning_; }
  void listen(); // 开始监听：调用 Socket::listen() 并让 Channel 关注可读事件

 private:
  void handleRead(); //  监听 fd 可读时调用，负责 accept() 新连接

  EventLoop* loop_; // 所属事件循环，所有 I/O 操作必须在此线程执行
  Socket acceptSocket_; // 监听 socket 的 RAII 封装
  Channel acceptChannel_; // 监听 socket 对应的 Channel
  NewConnectionCallback newConnectionCallback_;
  bool listenning_;
};

}

#endif  // MUDUO_NET_ACCEPTOR_H
